будет /p>
  • Фенька Frodo: можно командой POP <регистр> изменить адрес перехода в стеке, а команда RET выполнит возврат уже по измененному адресу.

  • Прием п
    i>

    Можно использовать пошаговое прерывание для затирания предыдущей команды и генерации новой.

  • Используйте префиксы, например cs:pushf (особенно при анализе трассировке).

  • Безумный код

    Простейший контроль времени должен помешать полной трассировке "безумного кода" вручную.

    Привратник состоит из основной программы и М процедур. Схема построения привратника базируется на том, что в нем выделяются команды, которые выполняются в пошаговом режиме (безумный код). После выполнения любой команды безумного кода возникает int 1h и управление получает первая процедура привратника. Передача управления следующей процедуре осуществляется либо с помощью команды int, либо с помощью простой команды перехода, либо при появлении определенных состояний аппаратуры, создаваемых в текущей процедуре. Все процедуры привратника выполняют примерно одинаковые функции:

    1. Модификация в процессе выполнения своего кода (в т.ч. расшифрование), приводящая к тому, что результат последнего прохода через процедуру отличается от результата текущего прохода.

    2. Внесение отдельных изменений в среду функционирования. Желательно добиться, чтобы вносимые изменения зависели от уже установленных характеристик среды.

    3. Верификация среды функционирования. Верификация среды не должна сводиться к простой проверке тех или иных параметров, т.к. такие проверки легко обходятся. Предлагается использовать те или иные характеристики среды для расшифровки или вычисления адреса перехода. Кроме верификации среды необходимо выполнить проверку правильности кодов привратника.

    Для этого нужно подсчитывать их CRC (коды процедур могут не быть константами).

    Самая последняя процедура в цепочке подключаемых процедур выполняет важную функцию - возврат управления на безумный код. Причем, команда безумного кода, получающая управление, выбирается из N возможных для выполнеия, где N <> 4. Передача управления на "случайную" команду безумного кода является принципиальным моментом, т.к. в этом случае установка контрольной точки после каждой команды безумного кода становиться бессмысленной. В свою очередь это приводит к резкому увеличению количества команд, выполняемых в пошаговом режиме, и, следовательно, к увеличению объема трассируемых данных. Число N выбирается большим 4 исходя из того, что в процессорах 386/486 можно одновременно устанавливать не более 4х контрольных точек.

      Следует обратить внимание на то, что адрес первой команды секретного кода не должен определяться явно при подключении привратника. Например, если привратник вызывается по команде CALL, то первая команда секретного кода не д.б. следующей за командой CALL, т.к. первая команда секретного кода является идеальным местом для установки контрольной точки (например, контрольной точки, срабатывающей при выборке команды по определенному адресу). Поэтому рекомендуется передавать привратнику адрес первой команды секретного кода в качестве зашифрованного параметра, который расшифровывается в процессе выполнения привратника.

      Принципы построения систем защиты

      Под системой защиты будем подразумевать комплекс программных средств, обеспечивающих затруднение или запрещение нелегального распространения, использования и/или изменения программных продуктов.

      Под несанкционированным доступом будем понимать нелегальные действия по использованию, изменению и уничтожению исполняемых модулей.

      Надежность системы защиты - это способность противостоять попыткам проникновения в алгоритм ее работы и обхода механизмов защиты.

      1. Простота механизма защиты, т. к. тщательное тестирование средства защиты возможно только для простых и компактных схем.
      2. В механизме защиты в нормальных условиях доступ должен отсутствовать.
      3. Механизм защиты можно не засекречивать, т.е. не имеет смысла засекречивать детали реализации систем защиты, предназначенной для широкого пользователя. Эффективность защиты не должна зависеть от опытности потенциального нарушителя.
      4. Разделение полномочий, т.е. применение нескольких ключей защиты. В ПЭВМ право на доступ д. определяться выполнением ряда условий.
      5. Максимальная обособленность механизма защиты. В целях исключения обмена информацией между пользователями рекомендуется при проектировании схем защиты сводить к минимуму число общих для нескольких пользователей параметров и характеристик механизма защиты.

      Функции системы защиты от НСД

      1. Идентификация защищаемых ресурсов.
      2. Аутентификация защищаемых ресурсов, т.е. устанока их подлиннсти на основе сравнения с эталоном.
      3. Определение прав доступа к защищаемым ресурсам.
      4. Обработка регистрационных журналов.
      5. Регистрация входа пользователя в систему.
      6. Регистрация выхода.
      7. Регистрация реакции на нарушение прав доступ.
      8. Контроль целостности и работоспособности. Контроль и разграничение производится на основе таблиц.

      Код системы защиты не должен содержать операций сравнения. Если операций сравнения нельзя избежать, то нужно использовать не контрольные значения, а необратимую функцию от них.

      Система противодействия

      Любую систему защиты от трассировки можно представить в виде:

      1. несекретная часть выполняет начальную настройку и подключение привратника;

      2. привратник открывает "вход" в секретную часть и делает невозможной дальнейшую трассировку;

      3. секретная часть выполняет секретные действия;

      4. несекретная часть выполняет завершающие действия, которые не являются критичными для понимания логики работы программы.

      В начале программы должны быть выполнены действия, которые невозможно скрыть от трассировки. Поэтому программа всегда начинается с несекретной части, в которой выполняются действия, не являющиеся принципиальными для понимания логики работы проги. Перед тем как перейти к выполнению "секретной" части, необходимо подключить процедуру, предотвращающую возможность дальнейшей трассировки. После работы "привратника" управление получает "секретная" часть программы, в которой выполняются все основные действия.

      Следует иметь в виду, что для обеспечения безопасной работы системы противодействия в "привратнике" и "секретной" части д.б. запрещены все внутренние и внешние прерывания, обработка которых не м.б. проконтролирована. Такое требование не является чрезмерным, если учесть, что вместо стандартной процедуры обработки любого прерывания м.б. использована некоторая процедура, разработанная лицом, желающим понять логику работы программы, служащая для выполнения трассировки. Прерывания д.б. запрещены как на уровне процессора (IF=0), так и на уровне контроллера прерываний. Более того, процедуры обработки тех прерываний которые не маскируются (внутренние прерывания процессора), д.б. заменены на собственные процедуры привратника.

      С учетом вышесказанного становится ясно назначение 2-ой несекретной части, получающей управление непосредственно после секретной части и выполняющей действия, которые невозможно выполнить при запрете прерываний. Эта несекретная часть программы может использовать команды INT, обращаться к операционной системе для выполнения тех действий, которые не могли быть выполнены в секретной части и т.п.

      Необходимо учесть, что привратник и секретная часть программы должна обнулить свой код и данные либо в процессе выполнения, либо перед завершением. Это совершенно необходимо в связи с тем, что при трассировке несекретной части можно получить доступ к памяти, занятой привратником и секретной частью; из этого следует, что прога, защищенная от трассировки, не м.б. повторно используема. Для повторного выполнения такой программы в оперативную память надо загрузить ее новую копию.

      Секретная часть программы следует сразу за привратником (поэтому ее трассировка становится невозможной) и выполняется в среде с запрещенными прерываниями, установленной привратником.

      Рассмотрим недостатки:

      1. Нет защиты от дизассемблирования.

      2. Если привратник не передает никакие параметры секретной части, то привратника можно обойти и осуществить трассировку всей программы без выполнения привратника.

      Эти проблемы можно решить, зашифровав коды привратника и секретной части программы перед тем, как передать ей управление. Для большей надежности можно шифровать и вторую несекретную часть программы.

      Расшифровка может выполняться по заложенному в привратник алгоритму, использующему ключ, который определяется основной программой. В результате для каждой проги будет получена уникальная гамма шифра.

      Функции привратника

      1. Сохранение среды функционирования и создание своей собственной среды. (За восстановление среды отвечает секретная часть). За одно можно перехватить обработку прерываний, приходящих от клавиатуры и мыши, а также установить собственный обработчик прерывания для обращения к BIOS видеоадаптера, чтобы лишить пользователя, выполняющего трассировку, возможности интерактивного управления трассировкой. Затем следует установить свои процедуры обработки прерываний 1h и 3h и применить их в привратнике для внутренних целей (например для динамического расшифрования).

      2. Динамическое расшифрование своего кода по мере выполнения.

      3. Расшифровывание кода проги по заданному ключу.

      4. Передача управления в заданное место расшифрованного кода.

      Некоторые методы взлома защит

      Любую систему защиты можно вскрыть за конечное время - это следует из того, что ее команды однозначно интерпретируются процессором. При этом время, необходимое для вскрытия хорошей системы защиты, оказывается сравнимым с написанием защищенной программы заново. Однако не все программы пишут профессионалы, поэтому часто можно вскрыть или обойти защиту, найдя ее слабейшее звено, сократив время вскрытия на несколько порядков. Для этого, в частности, можно рекомендовать следующие достаточно универсальные методы:

      1. если программа зашищена только от средств статического анализа, она легко изучается динамически, и наоборот;

      2. "метод изменения одного байта" - в момент, когда система защиты сравнивает контрольную информацию (состояние операционной среды, котрольную сумму) с эталонной, простым изменением команды перехода она направляется по правильному пути;

      3. аналогично, результат работы функции, возвращающей текущую контрольную информацию, может быть подменен на эталонное (ожидаемое) значение (например, с помощью перехвата соотвествующего прерывания);

      4. когда система защиты расшифровала критичный код, он может быть скопирован в другое место памяти или на диск в момент или вскоре после передачи управления на него. Частный случай - после окончания работы программы весь ее код расшифрован и доступен.

      Естественно, что в профессиональных системах защиты все эти приемы не проходят, и потребуются многие дни или месяцы кропотливой работы в отладчике, чтобы разобраться в их функционировании. Для исследования таких систем необходимы специальные средства (естественно, их с успехом можно применять и для любых других программ). Можно предложить следующие перспективные направления: интерпретация программы в полностью виртуальной среде, где эмулируются процессор, память, внешние устройства, операционнная среда и т.д. В этом случае все описанные приемы противодействия оказываются неэффективными; однако, какой бы прозрачной не была эмуляция среды, все равно она вносит возмущения в истинную, и программа может это распознать со всеми вытекающими отсюда последствиями. Самым трудным и слабым местом здесь будет точная эмуляция временных характеристик аппаратуры, недокументированных прерываний и т.п.

      Также можно отметить еще одну проблему, стоящую перед злоумышленником при исследовании защиты от стандартных отладочных средств является отслеживание прерываний, перехватываемых исследуемой программой. Суть проблемы заключается в следующем. Практически все стандартные отладчики для обеспечения своей нормальной работы "забирают", как минимум, 1-е и 3-е прерывания. 1-е прерывание, называемое также трассировочным, используется для осуществления пошагового режима работы отладчика. 3-е прерывание необходимо для установки меток останова программы по адресам, определяемым пользователем. Защитный механизм программы обязательно должен перехватывать указанные прерывания для предотвращения беспрепятственного анализа защищенной программы под отладчиком. Следовательно, очередной задачей злоумышленника на данном этапе является отслеживание момента перехвата. Если эта задача решена, то далее он может продвигаться по одному из следующих 2-х путей. Во-первых, можно запретить перехват прерываний путем обхода данного участка программы. В этом есть доля риска, так как подпрограммы обработки соответствующих прерываний могут выполнять некоторые "полезные" функции, необходимые для нормальной работы программы. Такой способ,например, может быть вполне пригоден, если вы интересуетесь работой защитного механизма пакета COPYLOCK. Если же ваш номер не прошел, то можно пойти по 2-му пути. Необязательно запрещать перехват прерываний. Если ваша квалификация достаточно высока и защитный механизм программы позволяет это сделать, то можно изменить подпрограммы обработки прерываний таким образом, чтобы после отработки своих функций они не сразу возвращали бы управление в основную программу, а передавали бы его соответствующим подпрограммам отладчика.

      Методы обхода перехвата защитой int 1h/3h

      Предположим, что привратник заменяет процедуры обработки int 1h/3h на собственные. Вместо этого выполняется следующая процедура:

      1. Запоминается содержимое векторов int 1h/3h.

      2. Заносятся в вектора int 1h/3h адреса процедур обработки привратника.

      3. Модифицируются процедуры обработки прерываний 1h и 3h так, чтобы заканчивались не командой возврата, а командой перехода на первую команду соответствующего обработчика прерываний самого отладчика.

      Как обойти антитрассировочные приемы

      ;отслеживаеются PUSHF (TF в стеке снимается)
      ;POPF (TF устанавливается)
      ;IRET (TF устанавливается)
      ;MOV SS,reg (после них ВСЕ трассируется)
      ;POP SS (----------'''-------------)
      ;INT xx (из стека убирается TF, при возврате ставится на место)

      Неважно, сколько префиксов (SS: CS: DS: ES: REP) будет стоять перед коммандой pushf и где-либо еще. Неважно, какое прерывание вы трассируете. Эту процедуру можно использовать много раз для трассировки нескольких прерываний; каждый раз перед вызовом нужно проставить в коде условия трассировки

      Невозможности:

      при перехваченном аппаратном прерывании или прерываниях по ошибкам (т.е. тех, которые вызываются не коммандой INT, а аппаратно), возможен перехват аппаратного прерывания и отслеживание в нем по стеку наличия трассировки).

      Отключение или иной "взлом" модуля проверки

      Модификация кода модуля защиты с целью обойти проверку или исказить ее результаты - один из наиболее распространенных методов, дающий самые удобные в использовании программы. Но он также и является самым трудоемким и длительным.

      Моделирование обращений к ключевой дискете

      Если не удается скопировать ключевую дискету, можно попробовать имитировать необходимый формат с помощью специальной программы, возвращающей в программу защиты все те коды завершения и ошибки, как при нормальной работе. Чаще всего такой метод применяется когда защита проверяет наличие какого-либо повреждения на поверхности дискеты ("дырки"), причем делает это через функции BIOS/INT 13h (Никогда так не делайте!). В этом случае весь процесс тоже длится не более нескольких минут. Хотя даже обращения к контроллеру гибкого диска через порты можно отследить, отлаживая программу в защищенном режиме. В конце-концов может помочь и IRQ 6/INT 0Eh вырабатываемый контроллером по выполнении команды. Так же (или почти также) можно имитировать обращения к электронному ключу на LPT или COM порту.

      Снятие программы из памяти и методы защиты

      Последнее время появилось множество программ снимающих навесные защиты методом снятия из памяти. Принцип здесь очень прост. После того как защита отработала и дала "добро" на выполнение, в памяти находится исходная программа в таком же виде, как будто ее запустили обычным образом, без всяких защит. Если в этот момент содержумое ОЗУ записать на диск, то из получившегося dump'а можно извлечь первоначальную программу. В лучшем случае получается работоспособный EXE-файл, практически идентичный первоначальной программе (правда для этого процесс получения dump'а нужно будет повторить два раза, для нахождения элементов таблицы перемещений -- Relocation Table).

      От снятия из памяти основной проги можно защитить лишь:

      1. перемещение защищаемой проги или ее фрагментов в памяти.

      2. шифрация части кода.

      3. запрет записи после передачи управления и разрешение записи после изменения отработанного куска.

      Защита в памяти:

      1. Нападение на программу после отработки отладочных средств.

      2. Нападение на защиту присоединительного типа.

        1. остановка на каком-либо прерывании в теле дополнительного модуля (например, при завершении работы программы вызывается прерывание завершения работы. На нем и остановимся.).

        2. остановка после заданного числа инструкций недалеко от конца дополнительного модуля (после определения примерной длины дополнительного модуля как разности между длинами защищенной и незащищенной программами можно приблизительно оценить количество команд в нем. Далее, задав точку останова после выполнения заданного количества команд, можно попасть к окончанию дополнительного модуля).

        3. останов в начале дополнительного модуля на одном из прерываний.

        4. полное прохождение антиотладочных средств.

      Использование возможности снятия с винчестера

      Предположим, имеется пакет, который можно инсталлировать на жесткий диск и который можно затем снять с винчестера с увеличением счетчика инсталляций. В таком случая действует простой алгоритм получения нелегальной копии:

      1. Установить программу на винчестер.

      2. Сделать копию винчестера (всего - на стриммер, или только занятых секторов), включая FAT, корневой каталог и прочие служебные области, если нужно.

      3. Снять программу с винчестера с восстановлением счетчика инсталляций.

      4. Восстановить запомненные области винчестера.

      Все! Теперь при неизмененном счетчике инсталляций, на винчестере имеется работоспособная копия программы.

      Другие методы взлома

      Эмулирующие отладчики и виртуальные машины

      В дополнение к обычным отладчикам существует особый класс программ, называемых эмулирующие отладчики. Они не пытаются корректно выполнять трассировку работающей программы, которая, к тому же, активно этому сопротивляется, а сами интерпретируют и выполняют ее машинные инструкции (например, вместо MOV AX, 56 они присваивают переменной, соотвествующей регистру AX - скажем, Reg_AX - число 56). Существуют также отладчики с неполной эмуляцией, которые эмулируют только "опасные" команды, а остальные выполняют на реальном процессоре.

      Такие отладчики нейтрализуют практически все методы противодействия отладке: блокировку прерываний и устройств, работу с контроллерами через порты, подсчеты контрольных сумм для выявления контрольных точек, контроль стека, а также, методы основанные на особенностях процессора и DOS. Плюс ко всему, эти отладчики имеют просто фантастические возможности для отладки: можно поставить контрольную точку по записи/чтению/или-там-еще-чему-угодно на любую область памяти или ряд портов ввода/вывода, на несоответствие конвейера команд и ОЗУ (!), и т. д. и т. п.

      Единственное, что пока можно им противопоставить (насколько я знаю), - это временные измерения, "параллельные процессы" и т. д., но и это до тех пор, пока не появится эмулятор микросхемы таймера - 8254 - способный синхронно работать с эмулятором процессора.

      Антиэвристика

      Идеальный символический исполнитель кода должен обладать такими свойствами:

      1. Эмуляция RAM в отдельном файле.

      2. Знание всех портов, учет ReadOnly и WriteOnly портов.

      3. Эмуляция работы прерываний, в особенности таймерных.

      4. Эмуляция работы с диском при небольших обьемах записи.

      5. Учет конвейера в зависимости от типа процессора.

      Антиэвристический прием: можно попробовать с DLL, т.к. она использует стек потока. Можно использовать как дизассемблер.

           cli
           mov ax, 1234h
           push ax
           mov bp, sp
           pop ax
           sti
        check:
           cmp ax, [bp]
           jne go
           jmp check     ;ждем любого прерывания
           dw 0FFFFh     ;через некоторое кол-во времени эмулятор перейдет сюда и
                         ;отвалит по Invalid Opcode.

      Следует обратить внимание на то, что адрес первой команды секретного кода не должен определяться явно при подключении привратника. Например, если привратник вызывается по команде CALL, то первая команда секретного кода не д.б. следующей за командой CALL, т.к. первая команда секретного кода является идеальным местом для установки контрольной точки (например, контрольной точки, срабатывающей при выборке команды по определенному адресу). Поэтому рекомендуется передавать привратнику адрес первой команды секретного кода в качестве зашифрованного параметра, который расшифровывается в процессе выполнения привратника.

      Принципы построения систем защиты

      Под системой защиты будем подразумевать комплекс программных средств, обеспечивающих затруднение или запрещение нелегального распространения, использования и/или изменения программных продуктов.

      Под несанкционированным доступом будем понимать нелегальные действия по использованию, изменению и уничтожению исполняемых модулей.

      Надежность системы защиты - это способность противостоять попыткам проникновения в алгоритм ее работы и обхода механизмов защиты.

      1. Простота механизма защиты, т. к. тщательное тестирование средства защиты возможно только для простых и компактных схем.
      2. В механизме защиты в нормальных условиях доступ должен отсутствовать.
      3. Механизм защиты можно не засекречивать, т.е. не имеет смысла засекречивать детали реализации систем защиты, предназначенной для широкого пользователя. Эффективность защиты не должна зависеть от опытности потенциального нарушителя.
      4. Разделение полномочий, т.е. применение нескольких ключей защиты. В ПЭВМ право на доступ д. определяться выполнением ряда условий.
      5. Максимальная обособленность механизма защиты. В целях исключения обмена информацией между пользователями рекомендуется при проектировании схем защиты сводить к минимуму число общих для нескольких пользователей параметров и характеристик механизма защиты.

      Функции системы защиты от НСД

      1. Идентификация защищаемых ресурсов.
      2. Аутентификация защищаемых ресурсов, т.е. устанока их подлиннсти на основе сравнения с эталоном.
      3. Определение прав доступа к защищаемым ресурсам.
      4. Обработка регистрационных журналов.
      5. Регистрация входа пользователя в систему.
      6. Регистрация выхода.
      7. Регистрация реакции на нарушение прав доступ.
      8. Контроль целостности и работоспособности. Контроль и разграничение производится на основе таблиц.

      Код системы защиты не должен содержать операций сравнения. Если операций сравнения нельзя избежать, то нужно использовать не контрольные значения, а необратимую функцию от них.

      Система противодействия

      Любую систему защиты от трассировки можно представить в виде:

      1. несекретная часть выполняет начальную настройку и подключение привратника;

      2. привратник открывает "вход" в секретную часть и делает невозможной дальнейшую трассировку;

      3. секретная часть выполняет секретные действия;

      4. несекретная часть выполняет завершающие действия, которые не являются критичными для понимания логики работы программы.

      В начале программы должны быть выполнены действия, которые невозможно скрыть от трассировки. Поэтому программа всегда начинается с несекретной части, в которой выполняются действия, не являющиеся принципиальными для понимания логики работы проги. Перед тем как перейти к выполнению "секретной" части, необходимо подключить процедуру, предотвращающую возможность дальнейшей трассировки. После работы "привратника" управление получает "секретная" часть программы, в которой выполняются все основные действия.

      Следует иметь в виду, что для обеспечения безопасной работы системы противодействия в "привратнике" и "секретной" части д.б. запрещены все внутренние и внешние прерывания, обработка которых не м.б. проконтролирована. Такое требование не является чрезмерным, если учесть, что вместо стандартной процедуры обработки любого прерывания м.б. использована некоторая процедура, разработанная лицом, желающим понять логику работы программы, служащая для выполнения трассировки. Прерывания д.б. запрещены как на уровне процессора (IF=0), так и на уровне контроллера прерываний. Более того, процедуры обработки тех прерываний которые не маскируются (внутренние прерывания процессора), д.б. заменены на собственные процедуры привратника.

      С учетом вышесказанного становится ясно назначение 2-ой несекретной части, получающей управление непосредственно после секретной части и выполняющей действия, которые невозможно выполнить при запрете прерываний. Эта несекретная часть программы может использовать команды INT, обращаться к операционной системе для выполнения тех действий, которые не могли быть выполнены в секретной части и т.п.

      Необходимо учесть, что привратник и секретная часть программы должна обнулить свой код и данные либо в процессе выполнения, либо перед завершением. Это совершенно необходимо в связи с тем, что при трассировке несекретной части можно получить доступ к памяти, занятой привратником и секретной частью; из этого следует, что прога, защищенная от трассировки, не м.б. повторно используема. Для повторного выполнения такой программы в оперативную память надо загрузить ее новую копию.

      Секретная часть программы следует сразу за привратником (поэтому ее трассировка становится невозможной) и выполняется в среде с запрещенными прерываниями, установленной привратником.

      Рассмотрим недостатки:

      1. Нет защиты от дизассемблирования.

      2. Если привратник не передает никакие параметры секретной части, то привратника можно обойти и осуществить трассировку всей программы без выполнения привратника.

      Эти проблемы можно решить, зашифровав коды привратника и секретной части программы перед тем, как передать ей управление. Для большей надежности можно шифровать и вторую несекретную часть программы.

      Расшифровка может выполняться по заложенному в привратник алгоритму, использующему ключ, который определяется основной программой. В результате для каждой проги будет получена уникальная гамма шифра.

      0

      1 0

      1 0

      1 0

      1 0

      1 0

      1 0

      1 0

      1 b

      3 b

      2 b

      1 b

      0 d

      r

      5

       

      d

      r

      6

      L

      E

      N

      3

      r

      3

      w

      3

      L

      E

      N

      2

      r

      2

      w

      2

      L

      E

      N

      1

      r

      1

      w

      1

      L

      E

      N

      0

      r

      0

      w

      0

      0

      0

      g

      d

      0

      0

      0

      1

      g

      e

      l

      e

      g

      3

      l

      3

      g

      2

      l

      2

      g

      1

      l

      1

      g

      0

      l

      0

      d

      r

      7                                             9 8 7 6 5 4 3 2 1 0  

      0 - для 386, 486

      1 - для Pentium

      DR7 - управляющий регистр

      Содержит информацию о точках останова (установка, тип)

      Биты GE и LE (Global и Local Exact data braekpoint match) определяют, будет ли исключение генерироваться сразу после завершения операции обмена при включенной ловушке данных, или оно произойдет несколько позже (или никогда). Бит LE автоматически сбрасывается при переключении задач, на бит GE переключение не действует. Ловушка на инструкции срабатывает всегда сразу.

      Биты Gi и Li (Global и Local breakpoint enable) разрешают срабатывание ловушек по контрольным точкам. Биты Li автоматически сбрасываются при переключении задач, на биты Gi переключение не действует. Автоматический сброс бита Li предотвращает лишние срабатывания при переключении задач.

      Регистр состояния отладки DR6 (Debug Status Register) позволяет обработчику исключения 1 легко определить его причину. Причин может быть несколько, и их идентифицируют биты DR6:

      Bi - срабатывание контрольной точки по регистру Dri,


      xor ax,ax
      mov es,ax
      push es:[ANYVECTOR]      ; сохраним старое значение
      mov es:[ANYVECTOR],dx    ; записываем в таблицу векторов
                               ; расшифровщик
      cmp es:[ANYVECTOR],dx    ; сравниваем
      je Decrypt               ; реальное исполнение

    1.  

    2. ...
      in al,40h ; считать значение поpта таймеpа
      xchg ah,al
      sti
      hlt
      in al,40h ; еще раз
      inc ax
      jz затеpеть_код_и_висеть ; AX=0FFFFh
      ...

      • ...
        mov ax,sp
        pushfd
        sub ax,sp
        cmp ax,4
        jne затеpеть_код_и_висеть
        ...

      • Невозможность эмулировать работу с критическими участками памяти (таблицей векторов и пр.);

      • эмулятор не способен обрабатывать опеpации с поpтами;

      • эмулятор не способен обрабатывать возвpаты фyнкций (INT 21h, 10h и т.д.);

      • эмулятор не способен обрабатывать опеpации с блоками памяти;

      • невозможно проэмулировать все порты (что из них считывается);

      • невозможна эмуляция конвейера;

      • возвраты из int;

      • наверняка же не проэмулирует, если II-ый поток изменит что-то в другом потоке;

      • эмулятор можнет эмулировать только конечное время;

      • не отличает ReadOnly и WriteOnly порты;

      • не эмулирует таймерные прерывания;

      • возможна эмуляция работы с диском при небольших объемах записи;

      • не эмулирует невозможность установки некоторых флагов в "1".

      • занести в стек флаги, а затем проверить их. Некоторые биты не должны изменяться (бит 1 всегда равен 1):

        mov ax, <значение>
        push ax
        popf
        pushf
        pop ax
        cmp ax, <значение>

      Отладочные регистры 80386

      Процессоры имеют четыре регистра для хранения 32-битных линейных адресов контрольных точек DR0..DR3. Эти регистры, в зависимости от значений соответствующих им полей LENi в регистре DR7, указывают на зону размером в байт, слово или двойное слово, попадание в которую вызывает срабатывание ловушки. LENi - количество байт (1,2 или 4)

      Тип перехватываемого обращения задается полем RWi:

      00 - выборка инструкции (по комманде),

      01 - только запись данных в память,

      10 - в 386-м и 486-м не используется; в процессорах Pentium+ при включении расширения отладки (в регистре CR4 бит DE = 1) - обращение к портам ввода-вывода,

      11 - чтение или запись данных в памяти.

      По типу исключения перехват выборки инструкции классифицируется как отказ (fault, обрабатывается до выполнения инструкции), а обращение к данным - как ловушка (trap, обрабатывается после пердачи данных).

      Бит GD (Global Debug Register Access Detect), доступный только в реальном режиме или в защищенном на уровне CPL = 0, позволяет отслеживать любые попытки доступа к отладочным регистрам. При GD = 1 любая попытка обращения вызовет исключение 1 (отказ).

      Отладочные регистры доступны в реальном режиме, а также в Protected Mode для уровня привилегий 0.

      DR0-3 содержит линейный адрес точки прерывания: (CS*10H+IP)
      DR4-5 зарезервированы.
      DR6 регистр статуса

      Все средства отладки оперируют обработчиком int 01h (Exception 01), поэтому обработчику int 01h необходимо знать, по какому случаю он был вызван. В регистре DR6 содержится причина вызова. Регистр DR6 не сбрасывается аппаратно, поэтому необходимо его очищать после каждой обработки Exception, иначе потом не узнаете причину вызова.

      В 32 битном регистре DR6 использованы 7 бит. При возникновении Exception процессор устанавливает в DR6 причину вызова:

      BT - вызван переключением задачи, в TSS которой бит (T)rap (ловушка)=1

      BS - трассировка - имеет наивысший приоритет - когда установлен BS, могут быть установлены и
      другие биты

      BD - следующая комманда будет считывать или записывать в один из 8 регистров отладки

      B0,B1,B2,B3 - произошел Exception по одному из отладочных регистров

      Линейный адрес точки останова 0

       

      Линейный адрес точки останова 1

      d

      r

      0

      Линейный адрес точки останова 2

      d

      r

      1

      Линейный адрес точки останова 3

      d

      r

      2

      Зарезервировано

      d

      r

      3

      Зарезервировано

      d

      r

      4

      0

      1

      b

      t

      b

      s

      b

      d

      0 0

      1

      0

      1

      0

      1

      0

      1

      0

      1

      0

      1

      0

      1

      0

      1

      b

      3

      b

      2

      b

      1

      b

      0

      d

      r

      5

       

      d

      r

      6

      L

      E

      N

      3

      r

      3

      w

      3

      L

      E

      N

      2

      r

      2

      w

      2

      L

      E

      N

      1

      r

      1

      w

      1

      L

      E

      N

      0

      r

      0

      w

      0

      0

      0

      g

      d

      0

      0

      0

      1

      g

      e

      l

      e

      g

      3

      l

      3

      g

      2

      l

      2

      g

      1

      l

      1

      g

      0

      l

      0

      d

      r

      7

                                                  9 8 7 6 5 4 3 2 1 0  

      0 - для 386, 486

      1 - для Pentium

      DR7 - управляющий регистр

      Содержит информацию о точках останова (установка, тип)

      Биты GE и LE (Global и Local Exact data braekpoint match) определяют, будет ли исключение генерироваться сразу после завершения операции обмена при включенной ловушке данных, или оно произойдет несколько позже (или никогда). Бит LE автоматически сбрасывается при переключении задач, на бит GE переключение не действует. Ловушка на инструкции срабатывает всегда сразу.

      Биты Gi и Li (Global и Local breakpoint enable) разрешают срабатывание ловушек по контрольным точкам. Биты Li автоматически сбрасываются при переключении задач, на биты Gi переключение не действует. Автоматический сброс бита Li предотвращает лишние срабатывания при переключении задач.

      Регистр состояния отладки DR6 (Debug Status Register) позволяет обработчику исключения 1 легко определить его причину. Причин может быть несколько, и их идентифицируют биты DR6:

      Bi - срабатывание контрольной точки по регистру Dri,

      BS - ловушка пошагового режима,

      BT - ловушка переключения задач (по биту T в TSS),

      BD - отказ при попытке доступа к регистрам отладки при GD = 1.

      Замечание. Флаги Bi имеют достоверное значение только для контрольных точек с установленными битами Li или (и) Gi.

      Генерация исключения по контрольным точкам может быть подавлена флагом RF регистра флагов процессора.

       

      На главную страницу...